iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1

有不少的感測IC的傳輸方式使用I²C協議,在教學I²C如何撰寫前,作者認為要先了解協議會比較好,不然遇到困難會看不懂錯哪,明明照手冊寫但數值卻跑不出來,這時候通常需要1個邏輯分析儀去看I²C的時序有沒有符合手冊上的時序或有沒有符合你想要寫入的時序。 以下為協議的介紹:

1.介紹:

I²C 是Inter-Integrated Circuit的縮寫,I²C 只是用兩條雙向的線
一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)
I²C(Inter-Integrated Circuit)字面上的意思是積體電路之間,它其實是I²C Bus簡稱,中文可說成積體匯流排電路,它是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連接低速週邊裝置而發展。I²C的正確讀法為「I平方C」("I-squared-C"),而「I二C」("I-two-C")則是另一種錯誤但被廣泛使用的讀法。

2.I2C 的實體界面:

I2C 的實體界面只有兩根訊號,分別稱之爲 SCL(serial clock)與 SDA(serial data),而由於 I²C 是一個 bus,在這個 bus 上所有的裝置都得透過這兩個訊號相連,也就是說 I²C 只需要兩根訊號線,就可以讓很多裝置彼此之間互相通訊。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979ow8RnEZzGT.png
上圖是一個典型的 I²C bus 電路,bus 上的所有裝置都透過 SCL/SDA 這兩根線相連。I²C 允許 bus 上可以有多個 master、多個 slave 存在,只要彼此的 address 不衝突、裝置數量沒有超過 bus 的電氣特性上限就沒有問題。
在這個電路中,有兩個上拉電阻,分別將 SCL 和 SDA 拉到 VCC。這兩顆電阻稱之爲 I²C bus 的「上拉電阻」(pull-ups),它們是 I²C bus 能正常運作的關鍵。

3.Wired-AND:

I²C bus 上所有的裝置都是透過 open-drain 或 open-collector 的方式來驅動 SCL 或 SDA。一般 push-pull 的數位邏輯輸出電路會有 high/low 兩顆電晶體,各自負責把輸出拉到 high 或 low 的工作,但 open-drain 或 open-collector 的輸出則只有 low-side 一顆電晶體。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979bsPDEvJmRG.png
從上面的電路可以看出,因爲 open-drain 輸出電路只有 low-side 一顆電晶體,它只能把輸出拉到 low,無法把輸出變成 high,因此當 open-drain 輸出的 low-side 電晶體不導通時,它就會呈現 high-Z 的高阻抗狀態,就好像它沒有接到任何東西一樣,所以設備與主機之間都需要接個上拉VDD的電阻以確保設備空閒時為High。

Wired-AND(線與)的重點:

當所有的裝置都輸出 high 時,bus 上的狀態才會是 high
只要有任何一個裝置輸出 low,bus 上的狀態就會是 low
https://ithelp.ithome.com.tw/upload/images/20210922/201419793hLWw3Ydhj.png
這樣的電路稱之爲「Wired-AND」邏輯,它的意思是用電路連接(wired)構成的 AND 邏輯,I²C bus 上的所有裝置,就是靠著 Wired-AND 的邏輯連接在一起的。

至於上拉電阻的大小,是 I²C bus 電路設計上一個很重要的參數。這個電阻放得太大的話拉 high 的速度會很慢,影響到 bus 高速運作的穩定性;放的太小,又會擔心裝置的驅動能力不夠,無法把 bus 拉得夠地

4.基本時序:

I²C bus 上的邏輯訊號有幾個重要原則要記得(核心原理):

  1. 當I²C bus 上沒有任何活動時,SCL 和 SDA 都維持在 high
  2. SCL 為 high 時, SDA 上的資料為有效,此時 SDA 的狀態不能改變,以確保接收方可以取樣到正確的 SDA 狀態(綠色部分)
  3. SCL 為 low 時,SDA 的狀態可以改變(藍色部分)
  4. 當 SCL 為 high 時,如果 SDA 變動,有兩種特殊狀況:(下圖黃色部分)
    SCL high、SDA 下降—START (開始信號)
    SCL high、SDA 上升—STOP (停止信號)

https://ithelp.ithome.com.tw/upload/images/20210922/20141979cdQItwtOr9.png

4-1.基本時序-Acknowledge(ACK)

每一個 8-bit 的資料傳輸結束後,會跟著一個 acknowledge bit。這個 acknowledge bit 固定由接收方產生,有兩種用法:
1.當 master 是傳送方、slave 是接收方,也就是說這個傳輸是 master 寫入資料到 slave 時,這個acknowledge bit 是用來讓 slave 告訴 master「收到!了解!正確!」
2.當 master 是接收方、slave 是傳送方,也就是說這個傳輸是 master 從 slave 讀取資料時,這個 acknowledge bit 是用來讓 master 告訴 slave「我還要接著讀,請繼續準備下一筆資料」或者是「夠了,我讀完了」。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979FFfTl9pShp.png
Acknowledge bit 的狀態定義是:
low -0 是「好、OK、收到、請繼續」
high -1 是「出錯了、沒有人在家、不要繼續」

4-2.基本時序-設備地址點名 (Address)

I²C 是一個多裝置的 bus,因此每當 master 發起傳輸時,它得先點名,就像老師叫特定座號的同學回答問題一樣,而這個座號就是I²C address。master不需要 I²C address,因為沒有人會點名老師起來回答問題。
因此所有的 I²C 傳輸週期,第一個 byte 都是用來點名的,它的內容就是被點到裝置的 address。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979K0olgOvW4q.png
上圖黃色的部份是呼叫從機的地址

4-3.基本時序-讀寫資料基本格式

下面是 I²C master 對 slave 寫入或讀取一個 byte 資料的格式:
https://ithelp.ithome.com.tw/upload/images/20210922/20141979fXlK8sfSbV.png
上圖是基本時序讀寫資料基本格式,紅框起來的是重要的地方這是根據你讀或寫來決定資料來去方向,左下角的部分是在說明MCU就像是主機,Sensor是從機在I²C是雙向傳輸資料的。

我附上我參考的網站,我做了重點筆記
參考網站:https://makerpro.cc/2020/05/i2c-interface-part2/

明天我就開始講說我如何用軟體去寫協定吧,先提一下I²C有兩種方式可以實現

1.硬體方式實現

利用官方寫好的I²C函式去使用,只能選擇有I²C複用功能的腳位。

2.軟體方式實現

直接控制GPIO口的高低電壓去達成I²C協議,任何IO口都可以用會選擇這方式會比較快弄懂I²C協議是如何運作的,對了解有很大的幫助,還有1個好處因為只需要用到兩個函式HIGH跟LOW組成各個的I²C協議部分,這樣不管移植到哪個MCU都不會有困難,可以說是0修改移植!-

理論上這軟體定義的方式會比官方訂好硬體的腳位上升速度和下降速度還來的慢,穩定度也是硬體方式的會比較好。


上一篇
[DAY 8] _用標準庫開發,以STM32F030為例
下一篇
[DAY 10] _軟體實現I2C協議
系列文
基於ARM-M0架構MCU之落摔檢測韌體開發35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言